#include<bits/stdc++.h> 
using namespace std;
// 	对于6和110，当6为十进制而110为二进制的时候，两者相等，现在给定任何一对正整
//	数N1和N2，在给定一个数进制的时候找到另一个数的能使两者相同的进制 
//1.每个输入具有一个测试用例，测试用例由一行组成，包括4个正整数，分别是N1，N2， 
//  tag和radix。N1和N2是两个不超过10位的数字，每个数码都小于其进制，选取0-9与 
//  a-z为数字的数码。radix是进制，而tag=1表示该进制是N1的，tag=2表示是N2的 
//2.对于每一个测试用例，输出使得N1==N2的另一个进制，如果结果不存在，则输出Impossible
//	如果结果不唯一则输出最小的符合条件的进制 
//3.遍历，进制转换，二分查找，map，极端数据 
map<char,int> num; // 用于存放进制转换的数码 
void init_(){
	for(int i = 0;i<=9;i++){
		char c = '0' + i;
		num[c] = i;
	}
	for(int i = 0;i<=25;i++){
		char c = 'a' + i;
		num[c] = i+10;
	}
}	//用于初始化数码表 

long long change(string number, long long radix){
	long long ans = 0;
	int lens = number.length();
	for(int i=0;i<lens;i++){
		ans += num[number[i]] * pow(radix, (lens-i-1));
		if(ans<0) return -1;
	}
	return ans;
}	//用于将radix进制的数字number转换为10进制表示，考虑到数据会很大，所以采用longlong来代替int，并且当和超过longlong的时候，直接返回-1 

long long get_radix(string s){
	int max_ = 0;
	for(int i = 0;i<s.length();i++){
		if(num[s[i]]>max_) max_ = num[s[i]];
	}
	return ++max_;
}	//用于获得某字符串能代表的最小进制，例如1234569，因为里面有9，所以至少是个十进制的数字 

void binary_search(string N1, string N2, long long radix){
	long long n1 = change(N1, radix);	//将N1由r进制转换为十进制 
	long long min_radix = get_radix(N2);	//调用g_r函数获得N2的最小进制 
	long long max_radix = max(n1+1, min_radix)+1;	//如果未知进制的N2==10，而n1=999，则N2最大只需要999进制就可以与之相等，而不需要更大，当N2再增加时，进制只会越来越低。
													//如果n1比下界小，N2==9，而n1=5，则上界就得按照N2来了，即上界=下届 
													//如果n1=0和1，N2也等于0的话，直接max是不行的，所以至少得给它整到2进制去 
	long long mid_radix, temp;	//用于存放上下界的中心进制，以及求出的中间结果 
	while(min_radix < max_radix){
		mid_radix = (min_radix + max_radix) / 2;
		temp = change(N2, mid_radix);
		if(temp == -1 || temp > n1){	//如果返回的结果超了longlong或者比n1大，则说明猜测的进制高了，需要调整上界 
			max_radix = mid_radix;
		} 
		else{	//其他情况的话，需要调整下界。 
			min_radix = mid_radix + 1;
		}
	}
	long long final_radix = --min_radix; //由于下界每次都+1了，所以最后输出前要记得-1来表示二分查找的最后结果 
	if(n1 == change(N2, final_radix)) cout<<final_radix<<endl;
	else cout<<"Impossible";
}	//本体最关键的函数体，用二分查找的方式节约跨度极大的进制猜测时间，具体看内部注释 

int main(){
	string N1,N2;
	int tag;
	long long radix; 
	cin>>N1>>N2>>tag>>radix;
	if(radix<2){	//不存在二进制以下的进制了 
		cout<<"Impossible"<<endl;
		return 0;
	}
	init_();	//初始化数码表 
	if(tag==1)	binary_search(N1, N2, radix);	//如果tag为1则这般输入，否则调换两者位置 
	else binary_search(N2, N1, radix);
	return 0;
} 